#include<iostream>
#include<vector>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>

typedef void (*Handler_t)();//函数指针类型

std::vector<Handler_t> handlers;//函数指针数组

//待处理的临时任务：这是在非阻塞等待时，交给父进程的任务
void fun1()
{
    printf("待处理临时任务1\n");
}

void fun2()
{
    printf("待处理临时任务2\n");
}

//Load函数：可用于注入待处理任务，将其设置为Load可做到切块处理，便于更改
void Load()
{
    handlers.push_back(fun1);
    handlers.push_back(fun2);
}

int main()
{
    pid_t id=fork();
    if(id<0)
    {
        return -1;
    }
    else if(id==0)//子进程
    {
        int count=5;
        while(count)
        {
            printf("I am child：%d\n",count--);
            sleep(1);
        }
        exit(9);//测试：此处数字无具体含义
    }
    else //父进程：演示非阻塞式等待，轮循检测
    {
        int quit=0;//类似flag，用于标记何时退出
        while(!quit)
        {
            int status=0;
            pid_t ret=waitpid(-1,&status,WNOHANG);
            if(ret>0)//等待成功+子进程退出
            {
                printf("等待子进程退出成功，退出码为：%d\n",WEXITSTATUS(status));
                quit=1;
            }
            else if(ret==0)//等待成功+子进程尚未退出
            {
                printf("子进程尚在运行中暂时未退出，此时父进程可处理其它事件\n");
                //…
                if(handlers.empty())
                    Load();
                for(auto iter:handlers)
                {
                    //执行相关任务
                    iter();
                }
            }
            else//waitpid等待失败 
            {
                printf("wait失败。\n");
                quit=1;
            }
            sleep(1);
        }
    }
    return 0;
}
